Глава I
1.5. Поверхности тензорного произведения

Кривая `C(u)` является вектор-функция одного параметра. Это отображение (де­формации) сегмента прямой линии в евклидовом трехмерном пространстве. Поверх­ность вектор-функция двух параметров, `u` и `v`, и представляет собой отображение об­ласти, `R`, `uv` плоскости в евклидовом трехмерном пространстве. Таким образом, она имеет вид `S(u,v)=(x(u,v),y(u,v),z(u,v))`, `(u,v)∈R`. Есть много схем для пред­ставления поверхностей. Они отличаются в координатных функциях, используемых в типах областей `R`. Наверное, самый простой метод, и одним из наиболее широко ис­пользуемых в геометрических приложениях моделирования, является схема тензор­ного произведения. Это метод, который мы используем в оставшейся части этой книги.

Метод тензорного произведения основан на схеме двунаправленной кривой. Он использует базисные функции и геометрические коэффициенты. Базисные функции двумерной функции `u` и `v`, которые построены в виде продуктов одномерных базисных функций. Геометрические коэффициенты расположены (топологически) в двух направ­лениях, `n×m` сети. Таким образом, поверхность тензорного произведения имеет вид

`S(u,v)=(x(u,v),y(u,v),z(u,v))=sum_{i=0}^n sum_{j=0}^mf_i(u)g_i(v)b_(i,j)` (1.20)

где   `{(b_{i,j}=(x_{i,j},y_{i,j},z_{i,j})),(0<=u","v<=1):}`

Обратите внимание, что домен `(u,v)` отображается как квадрат (в общем прямоугольником). Отметим также, что `S(u,v)` имеет матричную форму

`S(u,v)=[f_i(u)]^T[b_{i,j}][g_i(v)]`

где `[f_i(u)]^T` это `(1)×(n+1)` строчный вектор, `[g_i(v)]` вектор с `(m+1)×(1)` колонок, и `[b_{i,j}]` это `(n+1)×(m+1)` матрица трёхмерных точек.

В качестве примера рассмотрим степенную базисную поверхность

`S(u,v)=sum_{i=0}^nsum_{j=0}^ma_{i,j}u^iv^j=[u^i]^T[a_{i,j}][v^j]`   `{(a_{i,j}=(x_{i,j},y_{i,j},z_{i,j})),(0<=u","v<=1):}`(1.21)

Мы имеем `f_i(u)=u^i` и `g_i(v)=v^j`, и базисные функции как результат, `{u^iv^j}`. Если мы зафиксируем `u=u_0`, тогда

`C_{u_0}(v)=S(u_0,v)=sum_{j=0}^m sum_{i=0}^n a_{i,j} u_0^i v^j =sum_{j=0}^m b_j(u_0)v^j` (1.22)

где `b_j(u_0)=sum_{i=0}^na_{i,j}u_0^i`

это степенная базисная кривая лежащая на поверхности, `S(u,v)`. Кроме того, `C_{v_0}(u)` это степенная базисная кривая лежащая на `S(u,v)`; и кривые `C_{u_0}(v)` и `C_{v_0}(u)` пересекаются в точке на поверхности, `S(u_0,v_0)`. Эти кривые называются изопарамет­рические кривые (или изокривые). `C_{u_0}(v)` называются `v` кривая, `C_{v_0}(u)` называются `u` кривая (смотри рис 1.23).

Выражение (1.21) может быть записано

Рисунок 1.23. Поверхность тензорного произведения с изопараметрическими кривыми.

`S(u,v)=ubrace({a_{0,0}+a_{0,1}v+a_{0,2}v^2+⋯+a_{0,m}v^m})_(b_0)`

`+u ubrace({a_{1,0}+a_{1,1}v+a_{1,2}v^2+⋯+a_{1,m}v^m})_(b_1)`

`+u^2 ubrace({a_{2,0}+a_{2,1}v+a_{2,2}v^2+⋯+a_{2,m}v^m})_(b_2)`

`vdots`

`+u^n ubrace({a_{n,0}+a_{n,1}v+a_{n,2}v^2+⋯+a_{n,m}v^m})_(b_n)`

`=b_0+b_1 u+b_2 u^2+⋯+b_n u^n`

Члены в фигурных скобках простые многочлены, которые могут быть вычислены алгоритмом Горнера (А1.1), уступив `b_0,b_1,…,b_n`. Используя `bs` и перезапуская алго­ритм, мы получаем точку на поверхности. Таким образом, у нас есть алгоритм 1.6.

Алгоритм А1.6

Horner2(a,n,m,u0,v0,S)
{ /* Вычисление точку на степенной базисной поверхности. */
  /* Вход: a,n,m,u0,v0 */
  /* Выход: S */
 for (i=0; i<=n; i++)
   Horner1(a[i][],m,v0,b[i]); /* a[i][] это i-тая строка */
 Horner1(b,n,u0,S);       
        

Алгоритм А1.6 это обычный алгоритм поверхностей тензорного произведения. Они, как правило, могут быть получены путем расширения от алгоритмов кривой, часто путем обработки `n` (или `m`) строк коэффициентов (в виде кривых) в одном направлении, и дальнейшей обработки одной или несколько строк в другом направлении.

Дифференцируя уравнение (1.21), получаем

`S_u(u,v)=sum_{i=0}^nsum_{j=0}^mia_{i,j}u^{i-1}v^j`   `S_v(u,v)=sum_{i=0}^nsum_{j=0}^mja_{i,j} u^iv^{j-1}`

Обратите внимание, что при фиксированном `(u_0,v_0)`, `S_u(u_0,v_0)=C_(v_0)'(u_0)` и `S_v(u_0,v_0)=C_(u_0)'(v_0`). Нормальный вектор, `N`, вычисляется по формуле (1.4).

Нерациональные поверхности Безье получаются путем двухмерной сети контрольных точек и продуктов одномерных многочленов Бернштейна

`S(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)P_{i,j}`   `0<=u","v<=1` (1.23)

Базисная функция `B_0,2(u)B_1,3(v)` показана на рис 1.24а, и рис 1.24б показаны квадратная×кубическая поверхность Безье

Рисунок 1.24. (а) Базисная функция тензорного произведения Безье, `B_{0,2}(u)B_{1,3}(v)`; (б) квадратичная х кубическая поверхность Безье..

Для фиксированного `u=u_0`

`C_(u_0)(v)=S(u_0,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u_0)B_{j,m}(v)P_{i,j}`

`=sum_{j=0}^mB_{j,m}(v)(sum_{i=0}^nB_{i,n}(u_0)P_{i,j})`

`=sum_{j=0}^mB_{j,m}(v)Q_j(u_0)` (1.24)

где   `Q_j(u_0)=sum_{i=0}^nB_{i,n}(u_0)P_{i,j}`   `j=0,…,m`

это кривая Безье лежащая на поверхности. Аналогично, `C_{v_0}(u)=sum_{i=0}^nB_{i,n}(u)Q_i(v_0)` является `u` изокривой Безье лежащей на поверхности.

Как и в случае кривых, из-за их превосходных свойств Безье поверхности лучше подходят для геометрических приложений моделирования, чем степенные базисные поверхности. В частности,

Интересно отметить, что не существует никаких известных уменьшения вариации свойств для поверхностей Безье.

Алгоритм де Кастельжо (А1.5) также легко расширяется для вычисления точек на поверхности Безье. Обратимся к формуле (1.24) и рис 1.25. Пусть `(u_0,v_0)` фиксиро­ваны. При фиксированном `j_0`, `Q_{j_0}(u_0)=∑_{i=0}^nB_{i,n}(u_0)P_{i,j_0}` точка, полученная путем применения алгоритма де Кастельжо к `j_0` ряд контрольных точек, то есть до `{P_{i,j_0}}`, `i=0,…,n`. Поэтому, применяя алгоритм де Кастельжо `(m+1)` раз дает `C_{u_0}(v)`; и применяя его еще раз, чтобы `C_{u_0}(v)` на `v=v_0` даёт `C_{u_0}(v)=S(u_0,v_0)`. Этот процесс требует

Рисунок 1.25. Алгоритм де Кастелжо для поверхности Безье.

`{n(n+1)(m+1)}/2+{m(m+1)}/2` (1.25)

линейной интерполяции (смотри Упражнение 1.21). В силу симметрии, мы можем вычислить {C_{v_0}(u)} впервые (`n+1` приложения де Кастельжо), а затем вычислить `C_{v_0}(u)=S(u_0,v_0)}. Это требует

`{m(n+1)(m+1)}/2+{n(n+1)}/2` (1.26)

линейной интерполяции. Таким образом, если `n>m` вычисление первым `C_{v_0}(u)`, а затем `C_{v_0}(u_0)`; в противном случае, вычислить сначала `C_{u_0}(v)`, а затем `C_{u_0}(v_0)`.

Алгоритм А1.7

deCasteljau2(P,n,m,u0,v0,S)
{ /* Вычисление  точку  на  поверхности  Безье. */
/* по  де Кастельжо */
/* Вход: P,n,m,u0,v0 */
/* Выход: S */
If (n <= m)
   {
   for (j=0; j<=n; j++)  /* P[j][]  это  j-тая  строка */
      deCasteljau1(P[j][],n,u0,Q[j]);
   deCasteljau1(Q,m,v0,S);
   }
else
   {
   for (i=0; i<=n; i++)
      deCasteljau1(P[][i],m,v0,Q[j]);
   deCasteljau1(Q,n,u0,S);
   }
}
    

Определим рациональную поверхность Безье для перспективной проекции из четырехмерного многочлена поверхности Безье (смотри [Pieg86; Fari89])

`S^w(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u_0)B_{j,m}(v)P_{i,j}^w` (1.27)

и   `S(u,v)=H{S^w(u,v)}={sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)w_{i,j}P_{i,j}}/{sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)w_{i,j}}`

`=sum_{i=0}^nsum_{j=0}^mR_{i,n}(u,v)P_{i,j}` (1.28)

где   `R_{i,n}(u,v)={B_{i,n}(u)B_{j,m}(v)w_{i,j}}/{sum_{r=0}^nsum_{s=0}^mB_{r,n}(u)B_{s,m}(v)w_{r,s}}`

Обратите внимание, что `R_{i,n}(u,v)` являются рациональными функциями, но они не являются продуктами других базисных функций. Следовательно, `S(u,v)` не поверхность тензорного произведения, но есть `S^w(u,v)`. Как с кривыми, мы как правило, работают с формулой (1.27) и проецируем результат. Рисунок 1.26a показывает рациональную базисную функцию, а на рис 1.26б изображает квадратичную×кубическую рациональную поверхность Безье. Сравните эти рисунки с рисунками 1.24а и 1.24б.

Предполагая, `w_{i,j}>0` для всех `i` и `j`, свойств, перечисленных ранее для нерациональных поверхностей Безье (и функции продукта `B_{i,n}(u)B_{j,m}(v)` естественно распространяются для рациональных поверхностей Безье. Кроме того, если `w_{i,j}=1` для всех `i` и `j`, тогда `R_{i,n}(u,v)=B_{i,n}(u)B_{j,m}(v)`, и соответствующая поверхность нерациональная.

Рисунок 1.26. (а) Рациональная базисная функция `R_{0,i}(u, v)` (где `w_{0,1}=5` и все остальные веса равны единице); (б) квадратичная `xx` кубическая рациональная поверхность Безье.

Примеры

Пример1.15 Давайте построим цилиндрическую лоскутную поверхность. Из раздела 1.4 мы знаем, что

`C^w(u)=sum_{i=0}^2B_{i,2}(u)P_i^w`

Для `{P_i^w}={(0,1,0,1),(0,1,1,1),(0,0,2,2)}`, это круговая дуга в плоскости `yz`. Используя перенос (Св.1.14, Раздел 1.4)

`C_0^w(u)=sum_{i=0}^2B_{i,2}(u)P_{i,0}^w`   `C_1^w(u)=sum_{i=0}^2B_{i,2}(u)P_{i,1}^w`

где   `{P_{i,0}^w}={(1,1,0,1),(1,1,1,1),(2,0,2,2)}`

и   `{P_{i,1}^w}={(-1,1,0,1),(-1,1,1,1),(-2,0,2,2)}`

круговые дуги в плоскостях `x=1` и `x=-1`, соответственно (рис 1.27). Линейная интерполяция между `C_0^w` и `C_1^w` дает цилиндрическую поверхность, т.е.

Рисунок 1.27. Цилиндрическая поверхность как рациональная поверхность Безье.

`S^w(u,v)=sum_{i=0}^2sum_{j=0}^1B_{i,2}(u)B_{j,1}(v)P_{i,j}^w`

При фиксированном `u=u_0`, `C_{u_0}^w(u)=∑_{j=0}^1B_{j,1}(v)Q_j^w(u_0)` является отрезок прямой из `C_0^w(u_0)` в `C_1^w(u_0)` параллельно `x`-оси. Для фиксированного `v=v_0`, `C_{v_0}^w(u)=S^w(u,v_0)=∑_{i=0}^2B_{i,2}(v)Q_i^w(v_0)` круговая дуга в плоскости `x=(1-v_0)(1)+v_0(-1)=1-2v_0`. Теперь вычислим точку `S(1⁄2,1⁄2)`, используя алгоритм A1.7. Обратите внимание, что `n>m`. Во-первых получить `C_(v_0=1⁄2)^w(u)`
(1,1,0,1)
`(0,1,0,1)=Q_0^w(v_0)`
(-1,1,0,1)
(1,1,1,1)
`(0,1,1,1)=Q_1^w(v_0)`
(-1,1,1,1)
(2,0,2,2)
`(0,0,2,2)=Q_2^w(v_0)`
(-2,0,2,2)
Сейчас `C_{v_0=1⁄2}^w(u)=∑_{i=0}^2B_{i,2}(u)Q_j^w(v_0)` это круговая дуга в плоскости `yz`. Тогда
(0,1,0,1)
`(0,1,1/2,1)`
(0,1,1,1) `(0,3/4,1,5/4)=S^w(1/2,1/2)`
`(0,1/2,3/2,3/2)`
(0,0,2,2)
И результирующая проекция

`S(1/2,1/2)=H{(0,3/4,1,5/4)}=(0,3/5,4/5)`

Упражнения

  1. Рассмотрим два параметрических представления круговой дуги, заданной уравнениями (1.1) и (1.2). Используя формулу (1.1), вычислить точку на кри­вой в `u=π⁄4`, используя формулу (1.2), точка при `t=1⁄2`. Объясните полученные результаты.
  2. Вычислить вектор ускорения, `C''(u)`, для уравнения (1,1). Объясните результат.
  3. Использование тригонометрические функции, дать параметрическое определение ограниченной поверхности Изменить формулу (1.2), чтобы получить другое представление того же конуса. Вычислить первые частные производные, `S_u` и `S_v` тригонометриче­ского представления. Каковы значения этих производных в вершине конуса?
  4. Рассмотрим параболическую дугу `C(u)=(x(u),y(u))=(-1-u+2u^2,-2u+u^2)`, `0≤u≤1`. Эскиз этой кривой. Кривая вращается и перемещается на применении преобразований для функций `x(u)` и `y(u)`. Примените два преобразования
    (1) 90° вращение вокруг центра координат. Матрица поворота (применяется слева) является
    `[[0,-1],[1,0]]`
    (2) перенос по вектору `(-1,-1)`
    Неявное уравнение базовой параболы `x^2-4xy+4y^2-4x-y-5=0`. Эскиз этой кривой. Применить предыдущий поворот и перемещение к этому уравнению. Подсказка: пусть `bar x`, `bar y` будут преобразованными координатами. Найти выражения `x=f(bar x,bar y)` и `y=g(bar x,bar y)` и подставить их в неявное уравнение для получения неявного уравнения преобразованной параболы.
  5. Определить формулы для числа операций сложения и умножения, необходимых для вычисления точки на `n`-й степени трехмерной степенной базисной кривой.
  6. Построить кубическую степенную базисную кривую с петлей. Подсказка: думать о том, конечные точки и конечные производные, `C'(0)` и `C'(1)`, которые необходимы.
  7. Построить кубическую степенную базисную кривую с пиком. Подсказка: думать о `C'(u)` и `C''(u)`. Нарисуйте, что `x'(u)`, `y'(u)`, `x''(u)`, и `y''(u)` должны выглядеть как функции `u`. Определите подходящий `C''(u)`, а затем интегрировать, чтобы получить `C'(u)` и `C(u)`.
  8. Построить кубическую степенную базисную кривую с точкой перегиба.
  9. Пусть `C(u)=(x(u),y(u))=(1+u-2u^2+u^3,1-2u+u^3)`, `-1≤u≤1`. Пусть `u=2v-1`. Вывести кривую `C(v)` путем замены `2v-1` для `u` в `C(u)`. Какой степени кривая `C(v)`? Вычислите `C(u)` для `u=(-1,0,1)`. Вычислите `C(u)` для `v=(0,1⁄2,1)`. Что вы можете сказать о кривых `C(u)` и `C(v)`? `C(v)` называется репараметризацией `C(u)`.
  10. Проверьте свойство Св.1.7 многочленов Бернштейна, за исключением случаев `n=2` и `n=3`.
  11. Иногда бывает необходимо обратить кривую, то есть, учитывая `C_1(u)`, `0≤u≤1`, производят `C_2(v)`, `0≤v≤1`, так что две кривые же геометриче­ски, но `C_1(0)=C_2(1)` и `C_1(1)=C_2(0)`. Как бы вы сделали это, используя форму Безье? Степенную базисную форму?
  12. Рассмотрим плоскую кубическую кривую Безье `xy`, заданную контрольными точками `P_0=(0,6)`, `P_1=(3,6)`, `Р_2=(6,3)`, `Р_3=(6,0)`. Вычислить точку `С(1⁄3), используя алгоритм де Кастельжо. Вычислите ту же точку, используя уравнения (1.7) и (1.8) непосредственно, то есть оценивают базисные функции при `u=1⁄3` и умножают на соответствующие контрольные точки.
  13. Определите формулы для числа сложений и умножений, необходимых для вычисления точки на трехмерной кривой Безье `n`-й степени, используя алгоритм де Кастельжо A1.5 и алгоритм A1.4. Сравните результаты с упражнением 1.5 (алгоритм Хорнера).
  14. Для данного `n`, вектор строки `[B_{0,n}(u),...,B_{n,n}(u)]` можно записать как `[1,u,...,u^n]M`, где `M` это `(n+1)xx(n+1)` матрица. Таким образом, кривая Безье может быть записана в матричной форме, `C(u)=[n^i]^TM[P_i]`. Вычислить матрицы `M` для `n=1,2,3`. Обратите внимание, что установка `[a_i]=M[P_i]` приводит к преобразованию кривой Безье в степенную форму. Предполагая, что `0<=u<=1`, `[P_i]=M^-1[a_i]` дает преобразование из степенной базсной в форму Безье.
  15. Сравните это с Упражнением 1.9. Также можно определить кривую Безье на интервале параметров, отличном от `[0,1]`. Это эквивалентно повторной параметризации кривой Безье. Пусть

    `C(u)=sum_{i=0}^nB_{i,n}(u)P_i`   `u in [0,1]`

    Пусть `v in [a,b]`. Тогда `u=(v-a)/(b-a)`. Подставьте это уравнение в уравнение (1.8) и вывести это выражение для репараметризованной кривой

    `C(v)=1/(b-a)^nsum_{i=0}^nn!/{i!(n-i)!}(v-a)^i(b-v)^{n-i}P_i`

    Интересно отметить, что контрольные точки не меняются, только базисные функции. Повторная параметризация степенной базисной формы изменяет геометрические коэффициенты, но не базисные функции.
  16. Рассмотрим круг

    `C(u)=({1-u^2}/{1+u^2},{2u}/{1=u^2})`

    Определите, какие диапазоны параметров дают какие квадранты круга. Дают ли эти уравнения весь круг? Что вы можете сказать о параметризации?
  17. Рассмотрим следующую рациональную кубическую кривую Безье в плоскости `xy`: `P_0=(0,6)`, `P_1=(3,6)`, `P_2=(6,3)`, `P3=(6,0)`, `w_0=4`, `w_1=1`, `w_2=1`, `w_3=4`. Вычислить точку `С(2⁄3)`, расширив таблицу де Кастелжо.
  18. Какая характеристика используемых нами рациональных функций позволяет нам использовать однородное представление координат? Почему это представление выгодно?
  19. Найти рациональное представление круговой дуги Безье во втором квадранте, то есть определить `P_i` и `w_i`. Подсказка: используйте симметрию и проверьте свой результат, показав, что `(x(u))^2+(y(u))^2=1` для всех `u in [0,1]`.
  20. Дуга окружности в первом квадранте также задается уравнением

    `C(u)=({1+(sqrt 2-2)u+(1-sqrt 2)u^2}/{1+(sqrt 2-2)u+(2-sqrt 2)u^2},{sqrt 2/2 u((sqrt 2 - 2)u +2)}/{1+(sqrt 2-2)u+(2-sqrt 2)u^2})`

    Определить рациональное представление Безье, соответствующее этим уравнениям. Подсказка: `P_i` должен быть таким же, как и раньше - `(1,0)`, `(1,1)`, `(0,1)`; Зачем? Вычислите веса `w_i`, уравняв многочлены и подставив `u=0,1⁄2,1`, как было сделано ранее. Вычислите точку `С(1⁄2)`, используя любой метод. Что интересного в `С(1⁄2)`?
  21. Производные уравнения (1.25) и (1.26). Подсказка: используйте формулу `1+2+cdots+n=n(n+1)⁄2`
  22. Для примера с цилиндрической поверхностью (пример 15) вычислите контрольные точки `Q_j^w(u_0)` для изокривой `Q_j^{u_0=1⁄3}(v)`.
  23. Пусть `n=3` и `m=2`. Рассмотрим нерациональную поверхность Безье, определяемую сеткой управления.

    `{P_{i,0}}={(0,0,0),(3,0,3),(6,0,3),(9,0,0)}`

    `{P_{i,1}}={(0,2,2),(3,2,5),(6,2,5),(9,2,2)}`

    `{P_{i,2}}={(0,4,0),(3,4,3),(6,4,3),(9,4,0)}`

    1. нарисуйте эту поверхность;
    2. используйте алгоритм де Кастельжо для вычисления точки поверхности `S(1⁄3,1⁄2)`
    3. установите `u_0=1⁄2` и извлеките представление Безье (контрольные точки) кривой `C_{u_0}=1⁄2(v)`
  24. Пусть

    `S(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)P_{i,j}`

    и предположим, что `P_{0,0}=P_{1,0}=cdots=P_{n,0}`. Как это влияет на `S(u,v)`, производные `S_u(u,v)` и `S_v(u,v)` и Кривые `C_{v_0}(u)`? Предположим, что `P_{i,0}=(1,0,0)` для `i = 0,1,2` в Примере1.15, с `w_{0,0}=1`, `w_{1,0}=1`,`w_{2,0}=2`. Какой тип поверхность вы получаете?
  25. Предварительным условием для этой проблемы является Упражнение 1.14. Рациональная поверхность Безье (уравнение [1.27]) имеет вид матрицы

    `S^w(u,v)=[B_{i,n}(u)]^T[P_{i,j}^w][B_{j,m}(v)]=[u^i]^TM_n[P_{i,j}^w]M_m^T[v^j]`

    где `[u^i]^T` и `[v^j]` - векторы, `M_n` это `(n+1)xx(n+1)` матрица, `M_m^T` это `(m+1)xx(m+1)` матрица и `[P_{i,j}^w]` это `(n+1)xx(m+1)` матрица четырехмерных точек. Запишите эту форму явно для примера цилиндрической поверхности, пример 15. Используя эту матричную форму, вычислите точку `S^w(1⁄2,1⁄2)`, а затем спроецировать для получения `S(1⁄2,1⁄2)`. Для `S(u,v)` не существует прямой матричной формы, почему бы и нет?